feat(python-sdk): move template build-context uploads onto pyqwest - #1603
feat(python-sdk): move template build-context uploads onto pyqwest#1603mishushakov wants to merge 1 commit into
Conversation
🦋 Changeset detectedLatest commit: ccab1da The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
PR SummaryMedium Risk Overview The one-off upload client still streams the tar with an explicit Content-Length so S3 does not see chunked encoding; proxy settings are mapped via Reviewed by Cursor Bugbot for commit ccab1da. Bugbot is set up for automated code reviews on this repo. Configure here. |
Package ArtifactsBuilt from 7190dd6. Download artifacts from this workflow run. JS SDK ( npm install ./e2b-2.36.2-migrate-template-uploads-to-pyqwest.0.tgzCLI ( npm install ./e2b-cli-2.16.1-migrate-template-uploads-to-pyqwest.0.tgzPython SDK ( pip install ./e2b-2.35.0+migrate.template.uploads.to.pyqwest-py3-none-any.whl |
6288fe5 to
a6fdb80
Compare
a6fdb80 to
08cacf7
Compare
08cacf7 to
fa0a167
Compare
build_api.upload_file uses a one-off pyqwest transport; Content-Length framing verified at the wire level for both the spooled sync archive and the async-iterator body (S3 rejects chunked encoding). The upload-file regression tests compare header names case-insensitively since hyper lowercases them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fa0a167 to
ccab1da
Compare
What
Stacked on #1602 (which is stacked on #1601). Migrates the template build-context uploads (streaming the build archive to S3 presigned URLs in
build_api.upload_file) onto pyqwest via its httpx-compatible transport adapter.Originally deferred from #1601 because S3 presigned URLs reject chunked transfer encoding and Content-Length framing through reqwest was unverified. Verified at the wire level (raw-socket capture server): httpx's Content-Length — derived from the spooled archive (sync) or set explicitly on the async-iterator body (async) — is forwarded by the adapter and reqwest keeps Content-Length framing for streamed bodies, no chunked fallback.
Note
Rebased onto #1601, which maps
httpx.Proxyonto pyqwest'sProxyobject and therefore requires pyqwest 0.8 (released, and locked in #1601). The only change here is following the rename — this PR builds its transport fromproxy_to_config(...)instead ofproxy_to_url(...).How
e2b/template_sync/build_api.py/template_async/build_api.py:upload_fileuses a one-off pyqwest transport (ApiPyqwestTransportfrom feat(python-sdk): move the REST API client onto pyqwest's httpx transport adapter #1601) instead of the generated client's httpx transport.verify_ssl=Falseon the generated client is no longer honored for uploads (pyqwest has no insecure-TLS option), andhttp2=Falseis gone (S3 negotiates HTTP/1.1 via ALPN anyway).Testing
tests/{sync,async}/*/test_upload_file.py(the [JS SDK] uploadFile uses chunked transfer encoding, causing 501 NotImplemented on S3 presigned PUT URLs #1243 regression tests — Content-Length present and equal to the body, no chunked encoding) pass through pyqwest; the capture handlers now compare header names case-insensitively since hyper lowercases them where httpcore title-cased.ruff), typecheck (ty), unit suite: green.Usage example
No API changes — template builds upload their context exactly as before:
🤖 Generated with Claude Code